package cn.duhengkui.national.poi.saxexcel;
import java.util.Map;

import cn.duhengkui.national.poi.define.ExcelImportStatus;
import cn.duhengkui.national.valuelist.core.entity.BaseObject;


/**   
 * <table border="1">
 *	<tr><td>包名称：</td><td>cn.duhengkui.national.poi.saxexcel</td></tr>
 *	<tr><td>类名称：</td><td>IRowReader</td></tr>
 *	<tr><td>类描述：</td><td>excel读取处理类父类</td></tr>
 *	<tr><td>创建人：</td><td>杜恒奎</td></tr>
 *  <tr><td>创建时间：</td><td>2018年7月11日/下午3:04:18</td></tr> 
 *  <tr><td>版本：</td><td>1.0.0</td></tr>
 * </table>   
 *     
 */
public abstract class IRowReader<Entity extends BaseObject> implements RowHandler {
	


	
	/**
	* @Title: getEntity
	* @Description: 数据导入组装实体方法
	 * 该方法需要业务侧实现该风阀，组装具体的实际数据。通过Map数据与ENTITY的属性进行对应关系。
	* @param curRow
	* @param resultMap
	* @return
	* @return Entity
	*/ 
	public abstract Entity getEntity(int curRow,Map<Integer,String> resultMap);
	

	/**
	* @Title: dataValidate
	* @Description:  导入数据校验方法
	 * 1.进行导入数据的校验，通过校验结果进行数据后续处理操作。
	 * 返回结果枚举 UNDATABASE_ROOLBACK：该条数据不入库，且需要返回错误结果
	 * 返回结果枚举 UNDATABASE_UNROOLBACK：该条数据不入库，不需要返回错误结果
	 * 返回结果枚举 DATABASE_IMPORT：该条数据直接入库。（如果数据是覆盖更新，需要在实体中将主键的值进行设置。）
	* @param entity
	* @return
	* @return int
	*/ 
	public abstract ExcelImportStatus dataValidate(final Entity entity);
	
	
	
	/**
	* @Title: daoOption
	* @Description: 数据入库操作
	* @param entity
	* @return void
	*/ 
	public abstract void daoOption(Entity entity);
	
	/**
	 * 进行数据导入操作
	 * @param curRow 数据行号
	 * @param resultMap 需要进行操作数据
	 * @return ExcelImportStatus 单条导入校验状态
	*/
	public ExcelImportStatus operator(int curRow,final Map<Integer,String> resultMap,ReadResult readResult){
		Entity entity = getEntity(curRow,resultMap);
		ExcelImportStatus result = dataValidate(entity);
		if(result == ExcelImportStatus.UNDATABASE_ROOLBACK){
			readResult.setErrorResult(readResult.getErrorResult() + 1);
		}else if(result == ExcelImportStatus.DATABASE_IMPORT){
			readResult.setSuccessResult(readResult.getSuccessResult() + 1);
			daoOption(entity);
			resultMap.clear();
		}else if(result == ExcelImportStatus.UNDATABASE_UNROOLBACK){
			readResult.setErrorResult(readResult.getErrorResult() + 1);
		}
		readResult.setTotalCount(readResult.getTotalCount() + 1);
		return result;
	}
}
